// 这个文件实验一下捕捉信号的另一种方法即 sigaction结构体
#include<iostream>
#include<cstdio>
#include<signal.h>
#include<unistd.h>

// 搞一个小的倒计时系统
void alarmTime(int time)
{
    while(time >=0 )
    {
        printf("距离休眠结束还有 : %02d\r",time);
        fflush(stdout); // 以2个字符为单位刷新显示器
        time--;
        sleep(1);
    }
}

void handler(int signo)
{
    std::cout << "捕捉到一个信号:" << signo << std::endl;
    // 我在这里连续发送信号，只会接收到两个信号
    alarmTime(10);
}

int main()
{
    // 少有的类名和函数名相同的,sigaction竟然是c式的结构体
    struct sigaction ibect,obect;
    //我们只需要官这个结构的两个参数即可
    ibect.sa_flags = 0;
    ibect.sa_handler = handler;
    //用用户级的sig来处理sa_mask
    sigemptyset(&ibect.sa_mask);
    //顺便阻塞3号信号
    sigaddset(&ibect.sa_mask,3);
    // obect : 返回上次的捕捉方法，
    sigaction(SIGINT,&ibect,&obect);
    while(1) sleep(1);
    return 0;
}